RHCA436-基于CentOS8pacemaker+corosync 集群部署-ansible部署集群
安装部署集群
- 用yum模块安装pcs软件和fence代理软件
- 用firewalld配置防火墙规则
- 用user模块设置hacluster用户的密码
- 用service模块开启pcsd服务,设置开机自启
实验:配置安装集群
1.准备工作
[student@workstation ~]$ lab start auto-ha
2.查看playbook
[student@workstation ~]$ cd labs/auto-ha/
[student@workstation auto-ha]$ cat 01-preparing.yml
---
- name: Preparing the nodes for Red Hat High Availability cluster
hosts: nodes
become: yes
gather_facts: no
vars_files:
- passwords.yml
tasks:
- name: Ensuring the cluster packages are present
yum:
state: present
name:
- pcs
- fence-agents-ipmilan
- name: Ensuring the required ports are open
firewalld:
service: high-availability
permanent: yes
state: enabled
immediate: yes
- name: Ensuring the password for hacluster is configured
user:
name: hacluster
password: "{{ ha_password | password_hash('sha512') }}"
- name: Ensuring the pcsd service is started and enabled
service:
name: pcsd
state: started
enabled: yes
...
3.查看密码文件
[student@workstation auto-ha]$ ansible-vault view passwords.yml
Vault password: redhat
---
ha_password: tbe6W3hz
ipmi_login: admin
ipmi_password: password
4.安装集群前的准备工作
[student@workstation auto-ha]$ ansible-playbook --ask-vault-pass 01-preparing.yml
Vault password: redhat
5.编辑playbook
[student@workstation auto-ha]$ cat 02-deploying.yml
---
- name: Deploying a Red Hat High Availability cluster
hosts: nodea
become: yes
gather_facts: no
vars_files:
- passwords.yml
vars:
ha_cluster_name: cluster1
ha_nodes:
- nodea.private.example.com
- nodeb.private.example.com
- nodec.private.example.com
tasks:
- name: Ensuring the cluster nodes are authenticated
command:
# password of the hacluster user: {{ ha_password }}
# space-delimited list of nodes: {{ ha_nodes | join(' ') }}
cmd: "pcs host auth -u hacluster -p {{ ha_password }} {{ ha_nodes | join(' ') }}"
register: auth_cluster
changed_when: "'Authorized' in auth_cluster['stdout']"
- name: Checking the cluster configuration
stat:
path: /etc/corosync/corosync.conf
register: cluster_config
- name: Ensuring the cluster exists
command:
# cluster name: {{ ha_cluster_name }}
# space-delimited list of nodes: {{ ha_nodes | join(' ') }}
cmd: "pcs cluster setup {{ ha_cluster_name }} {{ ha_nodes | join(' ') }}"
register: create_cluster
changed_when: "'successfully set up' in create_cluster['stdout']"
when: not cluster_config['stat']['exists'] #判断文件是否存在
- name: Ensuring the cluster is enabled
command:
cmd: pcs cluster enable --all
register: enable_cluster
changed_when: "'Cluster Enabled' in enable_cluster['stdout']"
- name: Ensuring the cluster is started
command:
cmd: pcs cluster start --all --request-timeout=180 --wait=180
register: start_cluster
changed_when: "'Starting Cluster' in start_cluster['stdout']"
...
说明:
change_when: 当条件成立,则将任务改为change状态
--request-timeout=180: 集群启动超时时间为180s,给予充分的时间启动,集群节点如果180内没有反应,则不再启动
--wait: 等待该命令180s,如果还未完成,则返回错误
6.执行安装
[student@workstation auto-ha]$ ansible-playbook --ask-vault-pass 02-deploying.yml
Vault password: redhat
7.测试集群已经启动
[root@nodea ~]# pcs status
Cluster name: cluster1
8.配置fence
[student@workstation auto-ha]$ cat 03-stonith.yml
---
- name: Configuring fencing
hosts: nodea
become: yes
gather_facts: no
vars_files:
- passwords.yml
vars:
stonith_timeout: 180
tasks:
- name: Checking if the global STONITH timeout is set
command:
cmd: pcs property show stonith-timeout
register: stonith
changed_when: false
- name: Ensuring the global STONITH timeout is set
command:
cmd: "pcs property set stonith-timeout={{ stonith_timeout }}s"
when: "('stonith-timeout: ' + stonith_timeout|string + 's')
not in stonith['stdout']"
# pcs property set stonith-timeout=180s 设置stonith操作(fence)的超时时间是180s
- name: Ensuring the STONITH resources exist
include_tasks: create_ipmi.yml
loop:
- id: fence_nodea
node: nodea.private.example.com
ip: 192.168.0.101
# ipmi_login and ipmi_password are defined in the Vault protected
# passwords.yml file.
login: "{{ ipmi_login }}"
password: "{{ ipmi_password }}"
- id: fence_nodeb
node: nodeb.private.example.com
ip: 192.168.0.102
login: "{{ ipmi_login }}"
password: "{{ ipmi_password }}"
- id: fence_nodec
node: nodec.private.example.com
ip: 192.168.0.103
login: "{{ ipmi_login }}"
password: "{{ ipmi_password }}"
...
[student@workstation auto-ha]$ cat create_ipmi.yml
---
# Task file that creates a fence resource using the fence_ipmilan fencing agent.
#
# Expected variables:
# stonith_timeout
# item
#
# The item variable must be a dictionary with the following entries:
# id: name of the fence resource to create or update
# node: name of the cluster node
# ip: IP address of the IPMI over LAN device
# login: User name for accessing the IPMI over LAN device
# password: Associated password
- name: Checking if the STONITH resource exists
command:
cmd: "pcs stonith config {{ item['id'] }}"
register: result
failed_when: false
changed_when: false
- name: Ensuring the fence resource exists
command:
cmd: "pcs stonith create {{ item['id'] }} fence_ipmilan
pcmk_host_list={{ item['node'] }}
ip={{ item['ip'] }}
username={{ item['login'] }}
password={{ item['password'] }}
lanplus=1
power_timeout={{ stonith_timeout }}"
when: result['rc'] != 0
- name: Ensuring the fence resource is updated
command:
cmd: "pcs stonith update {{ item['id'] }}
pcmk_host_list={{ item['node'] }}
ip={{ item['ip'] }}
username={{ item['login'] }}
password={{ item['password'] }}
lanplus=1
power_timeout={{ stonith_timeout }}"
when: result['rc'] == 0
...
#执行安装
[student@workstation auto-ha]$ ansible-playbook --ask-vault-pass 03-stonith.yml
9.查看集群状态
#查看集群状态
[root@nodea ~]# pcs status
10.清理环境
[student@workstation auto-ha]$ lab finish auto-ha
实验:配置集群资源
1.准备工作
[student@workstation ~]$ lab start auto-res
2.查看playbook
[student@workstation auto-res]$ pwd
/home/student/labs/auto-res
[student@workstation auto-res]$ ls
01-deploy-httpd.yml 03-smoke-test.yml inventory solutions
02-create-resources.yml ansible.cfg resourcegroup.yml
3.安装httpd服务和放行防火墙和selinux
#安装
[student@workstation auto-res]$ ansible-playbook 01-deploy-httpd.yml
[student@workstation auto-res]$ cat 01-deploy-httpd.yml
---
- name: Deploying Apache HTTP Server on the nodes
hosts: nodes
become: yes
gather_facts: no
tasks:
- name: Ensuring the httpd package is installed
yum:
name: httpd
state: present
- name: Ensuring the required ports are open
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: Ensuring SELinux allows Apache HTTP Server to access NFS shares
seboolean:
name: httpd_use_nfs
state: yes
persistent: yes
...
3.创建资源
[student@workstation auto-res]$ ansible-playbook 02-create-resources.yml
[student@workstation auto-res]$ cat 02-create-resources.yml
---
- name: Creating the cluster resources to manage Apache HTTP Server
hosts: nodes[0]
become: yes
gather_facts: no
tasks:
- name: Collecting the existing resources
command:
cmd: pcs resource config
changed_when: false
register: resources
- name: Ensuring the firstwebfs resource exists
command:
cmd: >
pcs resource create firstwebfs Filesystem
device=storage.san01.example.com:/srv/www directory=/var/www
fstype=nfs options=ro --group=firstweb --wait=60
when: "'firstwebfs' not in resources['stdout']"
- name: Ensuring the firstwebserver resource exists
command:
cmd: pcs resource create firstwebserver apache --group=firstweb --wait=60
when: "'firstwebserver' not in resources['stdout']"
- name: Ensuring the firstwebip resource exists
command:
cmd: >
pcs resource create firstwebip IPaddr2
ip=172.25.250.80 cidr_netmask=24 --group=firstweb --wait=60
when: "'firstwebip' not in resources['stdout']"
...
说明:
--wait: 等待该命令180s,如果还未完成,则返回错误
4.测试
[student@workstation auto-res]$ curl 172.25.250.80
Hello, world!